package com.offcn;

import java.util.Stack;

/*
实现一个特殊的栈，在实现栈的基本功能的基础上，再实现返回栈中最小元素的操作。
【要求】1.pop、push、getMin操作的时间复杂度都是O（1）。2.设计的栈类型可以使用现成的栈结构。
//获取栈顶元素，但不弹出栈
 public synchronized E peek() {
        int     len = size();

        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }
    // elementCount  栈中有效元素的个数
      public synchronized E elementAt(int index) {
        if (index >= elementCount) {
            throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
        }

        return elementData(index);
    }

 */
public class code_exercises {
    public static void main(String[] args) {

        MyStack myStack = new MyStack();

        myStack.push(123);
        myStack.push(-23);
        myStack.push(123);
        /*System.out.println(myStack.pop());
        System.out.println(myStack.pop());*/
        System.out.println("----------------------------");
        myStack.push(123);
        myStack.push(23);
        myStack.push(56);
        System.out.println(myStack.getmin());
       //返回知道元素在
        System.out.println(myStack.search(123));
        System.out.println(myStack.search(0));

    }
}

//模拟栈的功能，返回当前栈中的最小元素。
class MyStack {
    private Stack<Integer> stackData;
    private Stack<Integer> stackMin;

    public MyStack() {
        //存储数据的栈
        stackData = new Stack<Integer>();
        //存储最小元素的栈
        stackMin = new Stack<Integer>();
    }

    //向栈中添加元素
    public void push(int num) {
        //判断栈中是否有元素
        if(this.stackData.isEmpty()) {
            this.stackMin.push(num);
        } else if(num <= this.getmin()) {
            this.stackMin.push(num);
        }
        //将元素添加进数据栈
        this.stackData.push(num);
    }

    public int pop() {
        if(this.stackData.isEmpty()) {
            throw  new RuntimeException("Your stack is empty");
        }
        //取出数据栈中的栈顶元素
        int value = this.stackData.pop();
        if(value == this.getmin()) {
            this.stackMin.pop();
        }
        return value;
    }
    public int getmin() {
        if(this.stackMin.isEmpty()) {
            throw  new RuntimeException("Your stack is empty");
        }
        //返回栈顶元素的值
        return this.stackMin.peek();
    }

    public int search(Object o) {
        int i = stackData.lastIndexOf(o);
        if(i >= 0) {
            return stackData.size() - i;
        }

        return -1;
    }
}